From 3741e6906e2954284ae349571fa0971d06db46fc Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Tue, 1 Nov 2016 18:03:16 +0100 Subject: [PATCH] inspector: Require toggling on/off of recording This way, we don't eat up all your memory every time you start the inspector. --- gtk/inspector/recorder.c | 90 +++++++++++++++++++++++++++++++++++++++ gtk/inspector/recorder.h | 16 ++++--- gtk/inspector/recorder.ui | 12 ++++++ 3 files changed, 112 insertions(+), 6 deletions(-) diff --git a/gtk/inspector/recorder.c b/gtk/inspector/recorder.c index 5c189fe03c..126118ff7f 100644 --- a/gtk/inspector/recorder.c +++ b/gtk/inspector/recorder.c @@ -38,6 +38,8 @@ struct _GtkInspectorRecorderPrivate GtkWidget *recordings_list; GtkWidget *render_node_view; GtkWidget *render_node_tree; + + guint recording : 1; }; enum { @@ -47,6 +49,15 @@ enum { N_NODE_COLUMNS }; +enum +{ + PROP_0, + PROP_RECORDING, + LAST_PROP +}; + +static GParamSpec *props[LAST_PROP] = { NULL, }; + G_DEFINE_TYPE_WITH_PRIVATE (GtkInspectorRecorder, gtk_inspector_recorder, GTK_TYPE_BIN) static void @@ -132,10 +143,64 @@ gtk_inspector_recorder_recordings_list_create_widget (gpointer item, return widget; } +static void +gtk_inspector_recorder_get_property (GObject *object, + guint param_id, + GValue *value, + GParamSpec *pspec) +{ + GtkInspectorRecorder *recorder = GTK_INSPECTOR_RECORDER (object); + GtkInspectorRecorderPrivate *priv = gtk_inspector_recorder_get_instance_private (recorder); + + switch (param_id) + { + case PROP_RECORDING: + g_value_set_boolean (value, priv->recording); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec); + break; + } +} + +static void +gtk_inspector_recorder_set_property (GObject *object, + guint param_id, + const GValue *value, + GParamSpec *pspec) +{ + GtkInspectorRecorder *recorder = GTK_INSPECTOR_RECORDER (object); + + switch (param_id) + { + case PROP_RECORDING: + gtk_inspector_recorder_set_recording (recorder, g_value_get_boolean (value)); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec); + break; + } +} + static void gtk_inspector_recorder_class_init (GtkInspectorRecorderClass *klass) { GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->get_property = gtk_inspector_recorder_get_property; + object_class->set_property = gtk_inspector_recorder_set_property; + + props[PROP_RECORDING] = + g_param_spec_boolean ("recording", + "Recording", + "Whether the recorder is currently recording", + FALSE, + G_PARAM_READWRITE); + + g_object_class_install_properties (object_class, LAST_PROP, props); gtk_widget_class_set_template_from_resource (widget_class, "/org/gtk/libgtk/inspector/recorder.ui"); @@ -170,6 +235,28 @@ gtk_inspector_recorder_init (GtkInspectorRecorder *recorder) } +void +gtk_inspector_recorder_set_recording (GtkInspectorRecorder *recorder, + gboolean recording) +{ + GtkInspectorRecorderPrivate *priv = gtk_inspector_recorder_get_instance_private (recorder); + + if (priv->recording == recording) + return; + + priv->recording = recording; + + g_object_notify_by_pspec (G_OBJECT (recorder), props[PROP_RECORDING]); +} + +gboolean +gtk_inspector_recorder_is_recording (GtkInspectorRecorder *recorder) +{ + GtkInspectorRecorderPrivate *priv = gtk_inspector_recorder_get_instance_private (recorder); + + return priv->recording; +} + void gtk_inspector_recorder_record_render (GtkInspectorRecorder *recorder, GtkWidget *widget, @@ -181,6 +268,9 @@ gtk_inspector_recorder_record_render (GtkInspectorRecorder *recorder, GtkInspectorRecording *recording; GdkFrameClock *frame_clock; + if (!gtk_inspector_recorder_is_recording (recorder)) + return; + frame_clock = gtk_widget_get_frame_clock (widget); recording = gtk_inspector_render_recording_new (gdk_frame_clock_get_frame_time (frame_clock), diff --git a/gtk/inspector/recorder.h b/gtk/inspector/recorder.h index 7f0980b844..557bb8c3f6 100644 --- a/gtk/inspector/recorder.h +++ b/gtk/inspector/recorder.h @@ -42,13 +42,17 @@ typedef struct _GtkInspectorRecorderClass G_BEGIN_DECLS -GType gtk_inspector_recorder_get_type (void); +GType gtk_inspector_recorder_get_type (void); -void gtk_inspector_recorder_record_render (GtkInspectorRecorder *recorder, - GtkWidget *widget, - GdkWindow *window, - const cairo_region_t *region, - GskRenderNode *node); +void gtk_inspector_recorder_set_recording (GtkInspectorRecorder *recorder, + gboolean record); +gboolean gtk_inspector_recorder_is_recording (GtkInspectorRecorder *recorder); + +void gtk_inspector_recorder_record_render (GtkInspectorRecorder *recorder, + GtkWidget *widget, + GdkWindow *window, + const cairo_region_t *region, + GskRenderNode *node); G_END_DECLS diff --git a/gtk/inspector/recorder.ui b/gtk/inspector/recorder.ui index 9ab46a4d69..4317d04859 100644 --- a/gtk/inspector/recorder.ui +++ b/gtk/inspector/recorder.ui @@ -7,6 +7,18 @@ True vertical + + + True + + + True + media-record + + + + + True -- 2.30.2